#ifndef XLCOMM_NET_POLLER_H_
#define XLCOMM_NET_POLLER_H_

#include <map>
#include <vector>

#include "xlcomm/base/date_time.h"
#include "xlcomm/define.h"
#include "xlcomm/net/detail/channel.h"
#include "xlcomm/net/event_loop.h"
#include "xlcomm/noncopyable.h"

namespace xlcomm {
namespace net {

// IO多路复用 抽象基类，可以有不同子类实现
// Poller是EventLoop的间接成员，只供其所属EventLoop在IO线程调用，因此无需加锁
class Poller : noncopyable {
 public:
  using ChannelList = std::vector<Channel*>;

  Poller(EventLoop* loop);
  virtual ~Poller();

  // 统一监听IO事件。输出活动的channels，返回监听到事件时的时间戳
  // 必须在所属EventLoop线程调用
  virtual Timestamp Poll(int timeout_ms, ChannelList* active_channels) = 0;

  // 更新channel监听的IO事件
  // 必须在所属EventLoop线程调用
  virtual void UpdateChannel(Channel* channel) = 0;

  // 移除channel监听的IO事件
  // 必须在所属EventLoop线程调用
  virtual void RemoveChannel(Channel* channel) = 0;

  // 检查是否持有某个Channel
  virtual bool HasChannel(Channel* channel) const;

  // 创建新Poller
  static Poller* CreatePoller(EventLoop* loop);

 protected:
  using FdChannelMap = std::map<int, Channel*>;

  FdChannelMap fd_channel_map_;
  EventLoop* loop_;
};

}  // namespace net
}  // namespace xlcomm

#endif  // XLCOMM_NET_POLLER_H_